/**
 * ProgramStatus.java
 */
package com.mht2017.common.dto;

/**
 * @author yutong.xiao
 * @date 2017年3月23日 上午10:36:03
 */
/**
 * @author yutong.xiao
 * @date 2017年4月11日 下午4:26:22
 */
public enum ProgramStatus {

	// start
	starting(10), registering(11), registerFailed(12), registered(13), started(14),
	// kafka
	kafkaStarting(21), kafkaStartingFailed(22), running(23), kafkaUpdating(24), kafkaUpdatingFailed(25), kafkaStopping(26), kafkaStoppingFailed(27), kafkaStopped(29),
	// stop
	stopping(31), stoppingFailed(32), stopped(39);

	private int id;

	private ProgramStatus(int id) {
		this.id = id;
	}

	@Override
	public String toString() {
		return String.format("%s[%s]", name(), id);
	}

	public static ProgramStatus parse(String string) {
		if (null == string || string.length() <= 0) {
			throw new RuntimeException(String.format("参数为空: '%s'", string));
		}

		if (string.matches("^\\w+\\[\\d+\\]$") == false) {
			throw new RuntimeException(String.format("格式不符合ProgramStatus: '%s'", string));
		}

		return Enum.valueOf(ProgramStatus.class, string.split("\\[")[0]);
	}

	public int id() {
		return id;
	}

	/**
	 * 获取对象的id
	 *
	 * @return 如果参数为null，则返回<code>-1</code>；否则将返回对象的id
	 */
	public static int getId(ProgramStatus programStatus) {
		return null == programStatus ? -1 : programStatus.id;
	}

	/** 广义的“正在停止”，包括正在停止系统和正在停止Kafka **/
	public static boolean isGeneralizedStopping(ProgramStatus programStatus) {
		return stopping.equals(programStatus) || kafkaStopping.equals(programStatus);
	}

	/** 广义的“停止”，如果为null，也表示已停止 **/
	public static boolean isGeneralizedStopped(ProgramStatus programStatus) {
		return null == programStatus || stopped.equals(programStatus) || kafkaStopped.equals(programStatus);
	}

	public static boolean isGeneralizedStop(ProgramStatus programStatus) {
		return isGeneralizedStopping(programStatus) || isGeneralizedStopped(programStatus);
	}
}
